html
c
ajax
python
mysql
database
linux
android
regex
objective-c
multithreading
html5
json
facebook
oracle
cocoa
delphi
asp
api
dom
The database will do some caching internally so execution time is not always the best indicator. If you run the first query and then run the second one right after it, the second is at an unfair advantage because some of the data will likely be cached.
Like all database tuning questions, nothing is really set in stone. I personally like the union because I think it's a bit more readable but strictly from a performance perspective I would do some extended testing over a longer period of time (to minimize the influence of caching) and see how they perform.
How much data is there in these tables? Do you have indexes on the id columns in the four tables? If not, that will speed your query up more any change to the sql.